package concurrent.copyOnWrite;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListDemo2 {

    /**
     * copyOnWrite弱一致性的测试
     * @param args
     */
    public static void main(String[] args){
        List<Integer> list = new CopyOnWriteArrayList<>();
        //先往list塞两个值
        list.add(3);
        list.add(4);

        //线程1先睡眠500毫秒，然后再添加2个数据。其他线程同时会执行
        new Thread(() -> {
            try {
                Thread.sleep(1);
            } catch (Exception e) {
                e.printStackTrace();
            }
            list.add(5);
            list.add(6);
        }).start();

        //线程2直接读取list里面的数据
        //线程2应该会最先执行完成，此时读只会读到以前的数据。因为可能写擦
        new Thread(() -> {
            for (Integer integer : list) {
                System.out.println("线程2：" + integer);
            }
        }).start();

        //线程3睡眠1秒，此时可能其他线程都执行完了。然后打印list
        //此时list的写操作已经执行完了，按照流程图，现在读应该读到更新后的数据
        new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            for (Integer integer : list) {
                System.out.println("线程3：" + integer);
            }
        }).start();
    }


}
